// 导入api
import { inserCart, findCartList, deleteCart, updateCart, checkAllCart, delCart } from '@/api/cart'
// 购物车数据
export default {
  namespaced: true,
  state: () => ({
    list: [] // 购物车列表
  }),
  mutations: {
    // 获取购物车列表
    setList (state, cartList) {
      state.list = cartList
    }
  },
  getters: {
    // 购物车
    // 总钱数  = 数组中的每一项的单价 * 数量 之和  reduce
    allPrice (state) {
      return state.list.reduce((pre, cur) => {
        return pre + cur.count * cur.price
      }, 0)
    },
    // 商品总数
    allCount (state) {
      return state.list.reduce((a, c) => a + c.count, 0)
    },
    // 选中商品总数
    selectedCount (state) {
      // filter筛选出被选中的商品
      // reduce累加出筛选数组中选中商品的总数
      return state.list.filter(item => item.selected).reduce((pre, cur) => pre + cur.count, 0)
    },
    // 选中商品总价
    selectedPrice (state) {
      // 选中商品总价等于已选中商品数量 * 商品现价
      return state.list.filter(item => item.selected).reduce((pre, cur) => pre + cur.count * cur.nowPrice, 0)
    },
    // 全选
    allSelected (state) {
      // 筛选出所有小选商品选中状态，影响全选
      return state.list.every(item => item.selected === true)
    }
  },
  actions: {
    // 购物车列表新增
    async asyncInsertCart (ctx, { skuId, count }) {
      // 加入购物车
      await inserCart({ skuId, count })
      // 获取购物车列表
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 购物车商品删除
    async asyncDelCart (ctx, ids) {
      await deleteCart(ids)
      // 重新获取购物车列表，更新
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 用户切换，不同用户购物车数据更新
    async upDateCartList (ctx) {
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 商品单选
    async asyncSingleCheck (ctx, goods) {
      await updateCart(goods)
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 商品全选
    async asyncAllCheck (ctx, selected) {
      await checkAllCart({ selected, ids: ctx.state.list.map(item => item.skuId) })
      // 重新获取购物车列表，更新
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 删除商品
    async asyncDelCommodity (ctx, ids) {
      await delCart(ids)
      // 重新获取购物车列表，更新
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    }
  }
}
